/**
 * 泛型约束: 默认情况下,泛型函数的类型变量Type可以代表多个类型,这导致无法访问任何属性
 * 此时,就需要为泛型添加约束来收缩类型(缩小类型取值范围)
 * 
 * 添加泛型约束收缩类型,主要有以下两种方式
 *      1.指定更加具体的类型
 *      2.添加约束
 */


function id<Type>(value:Type): Type {
    // console.log(value.length) //不存在length属性,无法访问
    return value
}

//1.指定更加具体的约束
//比如,将类型修改为Type[](Type类型的数组),因为只要是数组就一定存在length属性
function id2<Type>(value:Type[]): Type[] {
    console.log(value.length) // 数组所有方法都能使用了
    return value
}






//2.添加约束
interface ILength { length: number }
function id3<Type extends ILength>(value:Type): Type {
    //Type要满足具有length属性这个约束
    console.log(value.length) 
    return value
}
// id3(2) //传入的参数必须具有Length属性这个参数
id3([1,2,3])
id3('tom')
//只要满足有length属性这个约束就行,多了也行
id3({length:2, name:'jack'})


//1.创建描述约束的接口Length,该接口要求提供length属性
//2.通过extends关键字使用该接口,为泛型(类型变量)添加约束
//3.该约束表示:传入的类型必须具有length属性
//注意:传入的实参(比如,数组)只要有length属性即可,这也符合前面讲到的接口的类型兼容性









